package cn.tedu.charging.order.config;

import cn.tedu.charging.order.mqtt.MqttConsumer;
import cn.tedu.charging.order.mqtt.MqttContext;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;

/**
 * 连接EMQX消息中间件的配置类
 * 连接EMQX的目的是为了和设备通信
 */
@Slf4j
@Configuration
public class MqttConfiguration {

    @Autowired
    private MqttContext mqttContext;


    /**
     * 连接地址 tcp 协议 1883 端口号
     * 配置信息 应该 放到配置文件 或者放到 配置中心 nacos
     */
    private String host = "tcp://localhost:1883";

    /**
     * 用户名
     * 配置信息 应该 放到配置文件 或者放到 配置中心 nacos
     */
    private String username = "admin";

    /**
     * 密码
     * 配置信息 应该 放到配置文件 或者放到 配置中心 nacos
     */
    private String password = "public";

    /**
     * 客户端id
     * 相关的客户端id 不允许同时连接emqx
     * 为了让多个订单服务 能同时连接上 emqx 客户端id + 随机数
     */
    private String clientId = "order_service_client" + Math.random();


    /**
     * 通过  @Bean 注解，创建 MqttClient 对象并且交给spring容器管理
     * 别的在容器中的类 可以通过注入的方式 使用 MqttClient
     * @return
     */
    @Bean
    public MqttClient mqttClient() throws MqttException {
        //通过连接地址和客户端id创建 MqttClient 对象
        MqttClient mqttClient = new MqttClient(host, clientId);
        // 创建 MqttConnectOptions 连接相关的配置
        MqttConnectOptions options = new MqttConnectOptions();
        //配置用户名
        options.setUserName(username);
        //配置密码 char[] 字符串转成字符数组 password.toCharArray()
        // 把 字符串 转换为 字符数组
        options.setPassword(password.toCharArray());
        //options 有很多其他的配置 可以自己了解
    /*  options.setCleanSession(true);
        options.setKeepAliveInterval(60);
        options.setConnectionTimeout(30);
        options.setMaxInflight(100);
        options.setAutomaticReconnect(true);
        options.setExecutorServiceTimeout(1000);
  */
        options.setAutomaticReconnect(true);
        //MqttConsumer是通过java new 创建出来的，没有在spring容器中管理
        //1 通过构造方法 把MqttClient对象设置进去
        MqttConsumer mqttConsumer = new MqttConsumer(mqttClient,mqttContext);
        //2 通过setter方法 把MqttClient对象设置进去
        //mqttConsumer.setMqttClient(mqttClient);
        mqttClient.setCallback(mqttConsumer);
        // 通过配置和EMQX进行连接
        mqttClient.connect(options);
        log.debug("MQTT客户端准备和EMQX连接，是否连接成功不知道，" +
                "连接成功的结果是通过Callback回调" +
                "来通知订单服务中的MqttConsumer");
        return mqttClient;
    }
}
